package com.by.controller;

import cn.hutool.core.bean.BeanUtil;
import com.by.bean.Dept;
import com.by.bean.DeptTree;
import com.by.bean.User;
import com.by.common.bean.PageBean;
import com.by.common.bean.ResultBean;
import com.by.common.controller.BaseController;
import com.by.common.group.ISave;
import com.by.common.group.IUpdate;
import com.by.common.query.DeptQuery;
import com.by.service.DeptService;
import io.swagger.annotations.*;
import net.bytebuddy.implementation.bytecode.assign.primitive.PrimitiveUnboxingDelegate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * @author Ye QS
 * @version 0.1
 * @className DeptController
 * @description
 * @date 2024/9/9 10:15
 * @since jdk11
 */
@RestController
@RequestMapping("/v1")
@Api(tags = "部门管理")
public class DeptController extends BaseController {

    @Autowired
    DeptService deptService;


    @ApiOperation("保存部门")
    @PostMapping("/dept")
    public ResultBean save(@Validated @RequestBody Dept dept, BindingResult result) {
        validate(result);
        int rs = deptService.save(dept);
        return saveResult(rs);
    }

    @ApiOperation("修改部门")
    @PutMapping("/dept")
    public ResultBean update(@Validated(IUpdate.class) @RequestBody Dept dept, BindingResult result) {
        validate(result);
        int rs = deptService.update(dept);
        return updateResult(rs);
    }

    @ApiImplicitParam(name = "id", value = "部门id", required = true, defaultValue = "0", dataTypeClass = Integer.class)
    @ApiOperation("删除部门")
    @DeleteMapping("dept")
    public ResultBean delete(@ApiParam(name = "id", required = true, value = "要删除的id") @RequestParam(name = "id", required = true, defaultValue = "0") int id) {
        int rs = deptService.delete(id);
        if (rs == 2) {
            return fail("请先删除子部门");
        }
        return deleteResult(rs);
    }

    @ApiImplicitParams({
            @ApiImplicitParam(name = "id",
                    value = "部门id",
                    dataTypeClass = Integer.class,
                    required = true,
                    paramType = "query"),
            @ApiImplicitParam(name = "status",
                    value = "部门状态0 禁用 1 启用",
                    dataTypeClass = Integer.class,
                    required = true,
                    paramType = "query")
    })
    @ApiOperation("修改状态")
    @PutMapping("dept/status")
    public ResultBean updateStatus(@RequestParam(name = "id", required = true, defaultValue = "0") int id,
                                   @RequestParam(name = "status", required = true, defaultValue = "0") int status) {
        int rs = deptService.updateStatus(id, status);
        return updateResult(rs);
    }

    /**
     * 查询部门信息接口
     *
     * @param deptQuery 包含查询条件的部门查询对象，通过请求体传递
     * @return 结果封装对象ResultBean，携带消息“部门列表”
     */
    /**
     * 查询部门信息接口
     * <p>
     * 该方法用于接收客户端请求，通过POST方式提交查询参数，
     * 并返回特定部门的信息列表。
     */
    @ApiOperation("查询部门")
    @PostMapping("/dept/query")
    public ResultBean query(@RequestBody DeptQuery deptQuery) {
        // 将传入的DeptQuery对象转换为Map类型，便于后续处理
//        Map<String, Object> params = BeanUtil.beanToMap(deptQuery);

        // 调用服务层的方法进行数据查询，并获取分页后的结果
        List<Map> maps = deptService.queryChiLdDept(deptQuery);

        // 返回封装好的ResultBean对象，其中包含查询到的部门列表信息
        return success("部门列表", maps);
    }

    /**
     * 此方法用于查询并返回组织结构中的部门树信息。
     * 通过 HTTP GET 请求访问 /dept/tree 路径时触发此操作。
     *
     * @return 包含成功状态码及查询结果的 ResultBean 对象，其中结果为 List<DeptTree> 类型，
     *         表示所有部门及其子部门组成的树形结构。
     */
    @ApiOperation("查询部门树")
    @GetMapping("/dept/tree")
    public ResultBean queryTree() {
        // 调用 deptService 中定义的方法 queryTree 获取部门树数据
        List<DeptTree> deptTree = deptService.queryTree();

        // 返回封装好的响应对象，包含“部门树”标签和实际的数据内容
        return success("部门树", deptTree);
    }
}